# ------------http发展
# HTTP 协议 全称是超文本传输协议， 英文是 Hypertext Transfer Protocol
# HTTP 最初是用来在浏览器和网站服务器（web服务）之间 传输超文本（网页、视频、图片等）信息的
# 由于HTTP简洁易用，后来，不仅仅是浏览器 和 服务器之间 使用它， 服务器和服务器之间， 手机App 和 服务器之间，都广泛的采用。 成了一个软件系统间通信的首选协议之一
# ------------HTTP版本
# HTTP有好几个版本，包括： 0.9 、 1.0 、 1.1 、 2 、 3 ，当前最广泛使用的是 HTTP/1.1 版本,  而且在1.1以前的版本， 服务端返回响应给客户端后，连接就会断开 ，下一次双方要进行信息交流，必须重复上面的过程，重新建立连接，客户端发送请求，服务返回响应
# 到了 1.1 版本，建立连接后，这个连接可以保持一段时间（keep alive）， 这段时间，双方可以多次进行 请求和响应， 无需重新建立连接
# -------------HTTP特点
# HTTP 协议最大的特点是 通讯双方分为 客户端 和 服务端
# HTTP3 以前版本 （除了HTTP3） , 都是 基于 TCP 协议的， 所以要进行通讯，客户端 必须先和服务端 创建 TCP 连接

# 而且 HTTP 双方的信息交互，必须是这样一种方式：
# 客户端 先发送 http请求（request）给 服务端
# 然后服务端 发送 http响应（response）给 客户端
# 特别注意：HTTP协议中，服务端不能主动先发送信息给客户端

#-------------------------------------------------------HTTP请求消息-----------------------------------------------------
"""----------------------http请求消息由下面几个部分组成
GET /mgr/login.html HTTP/1.1             -------------请求行
Host: www.baiyueheiyu.com                ----------------------
User-Agent: Mozilla/6.0 (compatible; MSIE5.01; Windows NT)    |
Accept-Language: zh-cn                                        |请求头
Accept-Encoding: gzip, deflate---------------------------------
"""
"""--------------------------------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!------------------------------------------------
请求行 request line
是http请求的第一行的内容，表示要操作什么资源，使用的 http协议版本是什么, 里面包含了3部分信息： 请求的方法, 操作资源的地址, 协议的版本号
例如
GET /mgr/login.html HTTP/1.1
表示要获取资源， 资源的地址是 /mgr/login.html ， 使用的协议是HTTP/1.1
而
POST /api/medicine HTTP/1.1
表示添加资源信息，添加资源到地址 /api/medicine ， 使用的协议是HTTP/1.1
GET、POST是请求的方法，表示这个动作的大体目的，是获取信息，还是提交信息，还是修改信息等等

1).常见的HTTP请求方法包括：
--------------------------------------------------GET
从服务器获取资源信息，这是一种最常见的请求

比如要从服务器获取网页资源、获取图片资源、获取用户信息数据等等。

--------------------------------------------------POST
请求方法就应该是
添加资源信息到服务器进行处理（例如提交表单或者上传文件）
比如要添加用户信息、上传图片数据 到服务器 等等
具体的数据信息，通常在 HTTP消息体中， 后面会讲到

--------------------------------------------------PUT
请求服务器更新资源信息 
比如要更新用户姓名、地址等等
具体的更新数据信息，通常在 HTTP消息体中， 后面会讲到

--------------------------------------------------DELETE
请求服务器删除资源信息 。
比如要删除某个用户、某个药品等等
HTTP还有许多其他方法，比如 PATCH、HEAD 等，不是特别常用，暂且不讲。
2).请求行里面还包括了url，

比如
/mgr/login.html
url表示要获取资源的具体路径, 什么是url参数？
比如：
https://www.baidu.com/s?wd=iphone&rsv_spt=1
问号后面的部分 wd=iphone&rsv_spt=1 就是 url 参数，
每个参数之间是用 & 隔开的。
上面的例子中 有两个参数 wd 和 rsv_spt， 他们的值分别为 iphone 和 1 。
"""

"""--------------------------------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!------------------------------------------------
请求头 request headers

请求头是http请求行下面的 的内容，里面存放一些信息。

比如，请求发送的服务端域名是什么(Host)， 希望接收的响应消息使用什么语言(Accept-language)，请求消息体的长度(Content-Length)等等。
通常请求头 都有好多个，一个请求头占据一行
单个请求头的 格式是： "名字: 值"
HTTP协议规定了一些标准的请求头, 开发者，也可以在HTTP消息中 添加自己定义的请求头
"""

"""--------------------------------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!------------------------------------------------
消息体 message body(负载)

请求的url、请求头中可以存放一些数据信息， 但是有些数据信息，往往需要存放在消息体中。
特别是 POST、PUT等请求，添加、修改的数据信息通常都是存放在请求消息体中的

如果 HTTP 请求有消息体， 协议规定需要在消息头和消息体之间插入一个空行， 隔开它们。
请求消息体中保存了要提交给服务端的数据信息
比如：客户端要上传一个文件给服务端，就可以通过HTTP请求发送文件数据给服务端
文件的数据就应该在请求的消息体中

再比如：上面示例中客户端要添加药品，药品的名称、编码、描述，就存放在请求消息体中

WEB API请求消息体通常是某种格式的文本，常见的有:
* Json
* Xml
* www-form-urlencoded
"""

# -------------------------------------------------------HTTP响应消息-----------------------------------------------------
"""----------------------http响应消息由下面几个部分组成
HTTP/1.1 200 OK                         -------------状态行
Date: Thu, 19 Sep 2019 08:08:27 GMT     ----------------------
Server: WSGIServer/0.2 CPython/3.7.3                          |
Content-Type: application/json                                |
Content-Length: 37                                            |响应头
X-Frame-Options: SAMEORIGIN                                   |
Vary: Cookie                            ----------------------

{"ret": 0, "retlist": [], "total": 0}   --------------消息体
"""

"""--------------------------------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!------------------------------------------------
状态行 status line
状态行在第一行，包含3个部分：

协议版本
上面的示例中，就是 HTTP/1.1
状态码
上面的示例中，就是 200
描述状态的短语
上面的示例中，就是OK
我们重点来看一下状态码，它表示了服务端对客户端请求的处理结果 
状态码用3位的数字来表示，第一位的数字代表处理结果的大体类型，常见的有如下几种：

• 2xx
通常 表示请求消息没有问题，而且服务器也正确处理了
最常见的就是 200

• 3xx
这是重定向响应，常见的值是 301，302， 表示客户端的这个请求的url地址已经改变了， 需要客户端重新发起一个请求到另外的一个url

• 4xx
表示客户端请求有错误， 常见的值有：
400 Bad Request 表示客户端请求不符合接口要求，比如格式完全错误
401 Unauthorized 表示客户端需要先认证才能发送次请求
403 Forbidden 表示客户端没有权限要求服务器处理这样的请求， 比如普通用户请求删除别人账号等
404 Not Found 表示客户端请求的url不存在

• 5xx
表示服务端在处理请求中，发生了未知的错误。
通常是服务端的代码设计问题，或者是服务端子系统出了故障（比如数据库服务宕机了）
"""

"""--------------------------------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!------------------------------------------------
响应头 response headers
响应头是响应状态行下面的的内容，里面存放一些信息。 作用和格式与请求头类似，不再赘述
"""

"""--------------------------------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!------------------------------------------------
消息体 message body(响应)
有时候，http响应需要消息体。

同样， 如果 HTTP 响应有消息体， 协议规定需要在消息头和消息体之间插入一个空行，隔开它们
比如，白月SMS系统请求列出药品信息，那么药品信息就在HTTP响应消息体中
再比如，浏览器地址栏输入登录网址，浏览器请求一个登录网页的内容，网站服务器，就在响应的消息体中存放登录网页的html内容
和请求消息体一样，WEB API 响应消息体通常也是某种格式的文本，常见的有：
* Json
* Xml
* www-form-urlencoded
"""
